#include "stm32f10x.h"                  // Device header

void AD_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//第一步，开启RCC时钟，开启ADC1的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使用PA0口，开启PA0的时钟
	
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置ADCCLK，分频之后，ADCCLK=72MHz/6=12MHz
	
	GPIO_InitTypeDef GPIO_InitStructure;//下一步，配置GPIO 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//这里要选择AIN，模拟输入，这个模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);//PA0口就被初始化成了模拟输入的引脚了
	
	ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);//下一步，选择规则组的输入通道
	
	ADC_InitTypeDef ADC_InitStructure;//下一步，用结构体初始化ADC  Structure：结构 
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;
	ADC_InitStructure.ADC_NbrOfChannel = 1;
	ADC_Init(ADC1, &ADC_InitStructure);
	
	ADC_Cmd(ADC1, ENABLE);//开启ADC电源
	
	ADC_ResetCalibration(ADC1);//复位校准
	while (ADC_GetResetCalibrationStatus(ADC1) == SET);//返回复位校准的状态SET或RESET
	ADC_StartCalibration(ADC1);//开始校准
	while (ADC_GetCalibrationStatus(ADC1) == SET);//等待校淮是否完成，循环条件是，校准标志位是不是==SET
}

uint16_t AD_GetValue(void)//启动转换，获取结果
{
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);//软件触发转换的函数
	while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);//while空循环实现等待的过程
	//获取标志位状态的函数，需要判断规则组是不是转换完成，所以就使用第二个，规则组转换完成标志位，这个参数
	return ADC_GetConversionValue(ADC1);//取结果就用这个，ADC 获取转换值，它的返回值就是AD转换的结果
}
